<script>
  // 给出由小写字母组成的字符串 S，重复项删除操作会选择两个相邻且相同的字母，并删除它们。
  // 在 S 上反复执行重复项删除操作，直到无法继续删除。
  // 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

  // **** 题源：leetcode 1047

  // 输入："abbaca"  ca
  // 输出："ca"
  // 解释：
  // 例如，在 "abbaca" 中，我们可以删除 "bb" 由于两字母相邻且相同，这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca"，其中又只有 "aa" 可以执行重复项删除操作，所以最后的字符串为 "ca"。

  /**
   * 分析
   * 用栈结构 栈结构特点 后入先出 只需要对栈顶元素做操作 用栈顶元素 和 即将入栈的元素进行比较 相等栈顶元素进行出栈操作 即将入栈的元素还不能入栈
   */

  /**
   * @param {string} s
   * @return {string}
   */

  var s = 'abbaca';
  var removeDuplicates = function (s) {
    let stack = []; // 栈 容器

    for (let k of s) {
      console.log(k);
      if (stack.length && stack[stack.length - 1] === k) {
        stack.pop(); // 数组末尾删除
      } else {
        stack.push(k); // 数组末尾添加
      }
    }
    console.log(stack);
    return stack.join('');
  };

  console.log(removeDuplicates(s)); // 输出结果为 ca
</script>
